Les algorithmes gloutons dans la section Algorithmique.
Contenus : Algorithmes gloutons
Capacités attendus : Résoudre un problème grâce à un algorithme glouton.
Commentaires : Exemples : problèmes du sac à dos ou du rendu de monnaie. Les algorithmes gloutons constituent une méthode algorithmique parmi d’autres qui seront vues en terminale.
Dans ce chapitre nous allons aborder la notion d'optimisation d'un problème.
Un problème d'optimisation est un problème pour lequel on cherche la meilleure solution (selon un critère défini) dans un ensemble de solutions possibles.
Quelques exemples de problèmes d'optimisation :
Rendre la monnaie avec un minimum de pièces.
Ranger le maximum d'éléments : sac à dos, colis dans un camion, etc.
Réservation de véhicules dans une société pour minimiser la taille du parc nécessaire.
Parcourir un ensemble de lieux en minimisant le temps ou la distance nécessaire.
Et d'autres.
On parle de solution optimale toute une solution qui fait partie des solutions possibles et qui est la meilleure des solutions selon le critère défini.
Pour un rendu de monnaie, le critère pour la solution optimale sera le nombre de pièces et/ou billets.
Pour un parcours de lieux, le critère peut être le nombre de lieux ou la distance parcourue (minimale, maximale).
Pour un système de réservation, le critère peut être le nombre de réservations ou la durée de réservation.
Etc.
Les algorithmes gloutons sont souvent utilisés pour résoudre ces problèmes d'optimisation . On cherche une solution optimale en effectuant le meilleur choix possible à chaque étape de l'algorithme. Dans ce type de résolution, il n'y a pas de retour en arrière. Lorsqu'un choix est fait, il n'est pas modifié par la suite. On se retrouve donc à chaque étape, avec un problème de plus en plus petit à résoudre.
Attention toutefois, cette méthode ne fournit pas systématiquement la solution optimale au problème proposé.
Nous allons étudier un problème d'optimisation classique : le problème du rendu de monnaie de manière optimale. On cherche à rendre la monnaie avec un nombre minimal de pièces et billets.
Voici notre système de monnaie (exprimé en euros) :
Pièces : 0,01 ; 0,02 ; 0,05 ; 0,1 ; 0,2 ; 1 ; 2 .
Billets : 5 ; 10 ; 20 ; 50 ; 100 ; 200; 500.
On cherche par exemple à rendre $53$ euros. On peut dans un tableau énumérer quelques solutions possibles et choisir celle qui minimise le nombre de pièces et de billets.
Rendus de monnaie | Nombre de pièces et de billets |
---|---|
$5300 \times 0,01 €$ | 5 300 |
$53 \times 1 €$ | 53 |
$5 \times 10 + 1 \times 2 + 1 \times 1 €$ | 7 |
$ 2 \times 20 + 3 \times 5 + 1 \times 2 € $ | 6 |
$ 1 \times 50 + 1 \times 1 + 1 \times 2 € $ | 3 |
L'utilisation de ce type de méthode est très coûteux en temps de calcul car il faut explorer toutes les possibilités avant de trouver la solution optimale.
Présentation en vidéo.
Un algorithme glouton est un algorithme dans lequel on procède étape par étape en faisant, à chaque étape,
le meilleur choix possible.
On ne remet jamais en cause les choix faits aux étapes passées.
Dans notre cas nous allons rendre la monnaie en commençant par la pièce ou le billet avec la plus grande valeur possible (en restant inférieur à la somme à rendre). Cela correspond à notre dernière ligne de tableau ($ 1 \times 50 + 1 \times 1 + 1 \times 2 € $). On recommence ainsi jusqu'à obtenir une valeur nulle.
On note :
systeme : liste des pièces et des billets
somme : montant à obtenir
somme_restante : montant qui reste à rendre
monnaie : liste qui contient les valeurs rendues
Reprenons notre exemple avec somme=$53$ et systeme=$[0.01,0.02,0.05,0.1,0.2,1,2,5,10,20,50]$.
Voici la liste des étapes :
Étapes | liste des monnaies rendues | somme restant à rendre |
---|---|---|
Initialisation | monnaie=[] | somme_restante=$53$ |
Etape 1 | monnaie = $[50]$ | somme_restante=$3$ |
Etape 2 | monnaie = $[50,2]$ | somme_restante=$1$ |
Etape 2 | monnaie = $[50,2,1]$ | somme_restante=$0$ |
Notre solution dépend du nombre de pièces et de billets disponibles. Si nous sommes limités sur certaines pièces et/ou certains billets, les résultats seront différents.
Traiter comme précédemment le rendu de monnaie dans le cas d'un système S = $[1,2,5,50,100]$ et d'une somme : $ 27 €.$
Comment gérer le rendu de monnaie dans le cas d'un système S = $[1,2,5,50,100]$ et d'une somme : $ 27 €$ dans le cas où l'on ne dispose que de quatre pièces de chaque type ?
Quelles sont les préconditions
et les postconditions
de cet algorithme ?
On peut se poser la question pourquoi notre système monétaire ne possède pas de pièces ou de billets de 7 € ?
L'exercice suivant va vous permettre de mieux comprendre cela.
On considère le cas dans cet exercice du système S = $[1,2,5,7,10,20]$ et d'une somme : $ 14 €$.
Déterminer les pièces et billets rendus dans le cas de l'utilisation de l'algorithme glouton.
Quelles pièces ou billets suffit-il de rendre pour rendre 14€ ?
L'algorithme glouton donne-t-il toujours une solution optimale ?
Il existe des conditions sur le système pour que l'algorithme glouton soit optimal. Si le sujet vous intéresse, vous pouvez faire des recherches ou consulter cette partie de page Wikipedia.
Dans le système de pièces de la Zone Euro, l'algorithme glouton donne toujours une solution optimale.
Avant la décimalisation définitive de 1971, le système monétaire britannique reposé sur une subdivision de valeurs qui remontait à l'époque carolingienne.
Voici les principales valeurs de cet ancien système, appelé système impérial :
1 penny
3 pence (pluriel de penny)
6 pence (ou demi-shilling)
12 pence (appelé shilling)
24 pence (appelé florin)
30 pence (appelé demi-couronne)
60 pence (appelé couronne)
240 pence (appelé livre)
(source : wikipedia)
Quel sera le rendu de monnaie de 48 pences avec le système imperial $[240,60,30,24,12,6,3,1]$ dans le cas où on utilise l'algorithme glouton ?
Pouvez-vous trouver une solution plus optimale que celle obtenue par l'algorithme glouton ?
On considère désormais le système suivant : S=[2,5,10,20,50,100] et la somme à rendre de $21€$.
Proposez une trace d'exécution de l'algorithme glouton sur ce système et cette valeur à rendre.
Que remarquez-vous ?
Pouvez-vous trouver une solution (optimale ?) à ce problème de rendu de monnaie ?
Un algorithme glouton consiste à effectuer des choix "locaux" (dans le cas du rendu de monnaie : rendre la plus grande valeur possible), choix qui ne seront plus jamais remis en cause mais qui permettent de réduire le problème à un problème plus "simple" (dans le cas du rendu de monnaie : rendre la somme diminuée de la valeur maximale)
Les algorithmes gloutons constituent une méthode algorithmique, parmi d'autres, pour résoudre des problèmes, en particulier d'optimisation.
Lorsqu'un algorithme glouton permet d'obtenir une solution, celle-ci n'est pas forcément la solution optimale au problème.
Un algorithme glouton peut ne trouver aucune solution bien que des solutions existent.
Nous verrons en terminale une méthode pour créer un algorithme, pas trop coûteux, qui permet d'obtenir la solution optimale à coup sûr.
Voici une vidéo qui reprend les limites de l'algorithme glouton dans le cas du rendu de monnaie au travers des exercices précédents :
Programmer l'algorithme glouton de rendu de monnaie en langage python.
Pour cela, programmer une fonction rendu_monnaie_glouton
qui possède comme paramètres
un système de pièces et de billet systeme
sous forme de liste de nombres ;
une somme à rendre somme
.
Cette fonction renvoie une liste de nombres qui caractérise la monnaie à rendre.
penser à trier par ordre décroissant la liste des pièces et billets.
Vous pouvez prendre comme jeu de test de l'exemple de présentation.
Améliorer cette fonction pour prendre en compte le fait que l'algorithme ne trouve pas de solution dans certains cas.
prendre certains exemples du chapitre 1.3 pour tester cette version améliorée.
Des vidéos pour vous aider à comprendre.
Pour partir en randonnée, vous disposez d'un sac à dos. Afin de pouvoir marcher longtemps chaque jour, vous décidez de limiter la masse totale transportée
à 17kg. Cette limitation ne vous permet pas de pouvoir transporter tous les éléments que vous aimeriez emporter.
Vous décidez de donner une note "utilité" à chacun des objets.
Objet | eau | nourriture | nécessaire de cuisine | couverture | matelas | tente | gaz | lampe | console de jeu | change | jumelle | cartes | pull | machette | livre de chevet |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Masse | 3 | 4.3 | 2.2 | 1 | 1.5 | 3.4 | 0.8 | 0.5 | 2.1 | 2.8 | 1.3 | 0.5 | 0.8 | 2.4 | 0.3 |
Utilité | 20 | 15 | 12 | 6 | 4 | 18 | 13 | 10 | 7 | 11 | 9 | 8 | 8 | 5 | 2 |
Vous cherchez à maximiser l'utilité totale des objets emportés dans votre sac à dos.
Sans ordinateur
Le fait de prendre ou non chaque objet est un choix binaire.
Si vous voulez tester toutes les possibilités pour remplir votre sac à dos afin de trouver la ou les solutions optimales, combien de cas
devez-vous etudier ?
Si vous utilisez un algorithme glouton avec comme critère l'optimisation de l'utilité, quelle sera la composition de votre sac à dos ?
Avec ordinateur
N'étant pas certain.e.s de la pertinence du résultat obtenu, vous décidez de choisir les objets non plus en fonction de leur seule
utilité mais en fonction de leur utilité massique c'est-à-dire en fonction du rapport $\frac{utilité}{masse}$.
De plus, plutôt que de tout recalculer à la main, vous préférez utiliser une programme informatique en langage Python.
L'ensemble des objets pouvant être choisis pour la randonnée est implémentée par une liste de dictionnaires, chaque dictionnaire ayant pour clé
le nom Nom
de l'objet, la masse Masse
et l'utilité Utilite
.
Voici un fichier donnant cette liste.
Compléter chaque dictionnaire de la liste en rajoutant une clé Utilite_massique
qui a pour valeur l'utilité massique de l'objet
considéré.
Quel prétraitement sur la liste de dictionnaires est-il pertinent d'effectuer afin de pouvoir écrire un algorithme glouton renvoyant un résultat selon le critère pris en compte ?
Proposer une implémentation en langue Python de l'algorithme glouton permettant de remplir le sac à dos suivant le critère choisi.
Qu'allez-vous emmener en randonnée ?
Propriétaire des ressources ci-dessous : ministère de l'Éducation nationale et de la jeunesse, licence CC BY SA NC
Voici une sélection de questions issues de la banque nationale de sujets, répondez à ces questions (attention, cette sélection n'est pas exhaustive).
À quelle catégorie appartient l’algorithme classique de rendu de monnaie ?
Réponses :
A- Les algorithmes de classification et d'apprentissage.
B- Les algorithmes de tri.
C- Les algorithmes gloutons.
D- Les algorithmes de mariage stable.
On dispose en quantité illimité de pièces de 1 euro, 2 euros et 5 euros. On veut totaliser une somme de
18 euros.
Quelle est la solution donnée par l’algorithme glouton ?
Réponses :
A- [5, 5, 5, 2, 1].
B- [5, 5, 5, 2, 2, 1].
C- [5, 5, 2, 2, 2, 1, 1].
D- [5, 2, 2, 2, 2, 1, 1, 1, 1, 1].
On dispose de sacs de jetons portant les nombres 10, 5, 3 et 1.
On veut obtenir un total de 21 en utilisant ces jetons.
Si on utilise le principe de l'algorithme glouton, quelle addition va-t-on réaliser pour obtenir ce total de 21 ?
Réponses :
A- 5 + 5 + 5 + 5 + 1.
B- 10 + 5 + 3 + 3.
C- 10 + 5 + 5 + 1.
D- 10 + 10 + 1.
Les QCM suivants sont des QCM modifiés à partir de QCM se trouvant sur le site https://genumsi.inria.fr.
Parmi les phrases suivantes, laquelle est vraie ?
Réponses :
A- Un algorithme glouton fournit toujours une solution optimale.
B- Un algorithme glouton est généralement moins coûteux en temps que d'autres méthodes d’optimisation.
C- Un algorithme glouton étudie tous les cas possibles pour déterminer la solution optimale.
D- Un algorithme glouton peut revenir en arrière en cas de blocage.
Un sherpa doit traverser la montagne pour vendre des marchandises dans le village voisin. Il ne peut transporter plus de 20kg dans son sac à dos et
il dispose de 6 objets de poids différents et de valeurs différentes.
Voici cette liste d'objets sous forme d'un dictionnaire dont les clés sont le nom de l'objet nom
, la valeur en euros valeur
,
et la masse en kg masse
.
Objets=[{nom:"A", valeur:10, masse:8},{nom:"B", valeur:8, masse:12},
{nom:"C", valeur:5, masse:3},{nom:"D", valeur:9, masse:6},
{nom:"E", valeur:7, masse:5},{nom:"F", valeur:6, masse:2}]
Il se demande quels objets choisir pour transporter la valeur totale maximale dans son sac tout en ne dépassant pas 20 kg.
Quels objets doit-il mettre dans son sac s'il applique un algorithme glouton dans la résolution de ce problème ?
Réponses :
A- Objet "B" puis objet "A"
B- Objet "A" puis objet "D" puis objet "E"
C- Objet "C" puis objet "D" puis objet "E" puis objet "F"
D- Objet "B" puis objet "E" puis objet "C"
Un commerçant vit dans un pays dont le système monétaire est constitué de pièces et de billets ayant pour valeur faciale : 1, 2, 5, 10, 20, 50, 100, 200
et 500. On note euros
la liste des valeurs faciales disponibles pour un rendu de monnaie par le commerçant. (le
commerçant peut posséder plusieurs pièces ou billets de même valeur)
euros = [1, 1, 1, 1, 1, 2, 2, 2, 5, 10, 10, 10, 20, 50, 100, 100, 100, 200, 500]
On souhaite écrire un programme qui affiche la monnaie que le commerçant devra rendre.
On note s
la somme à rendre en supposant que celle-ci est inférieure ou égale à 1000.
Parmi les 4 programmes suivants, lequel est correct ?
Réponses :
A-
def monnaie(s) :
i = len(euros)
p = 0
while s > 0 :
if s >= euros[i] :
p +=1
s -= euros[i]
else :
i = i - 1
return p
B-
def monnaie(s) :
i = len(euros) - 1
p = 0
while s > 0 :
if s >= euros[i] :
p +=1
s -= euros[i]
else :
i = i - 1
return p
C-
def monnaie(s) :
i = len(euros) - 1
p = 0
while s >= 0 :
if s >= euros[i] :
p +=1
s -= euros[i]
else :
i = i - 1
return p
D-
def monnaie(s) :
i = len(euros) - 1
p = 0
while s > 0 :
if s > euros[i] :
p +=1
s -= euros[i]
else :
i = i - 1
return p
On dispose de sacs de jetons portant les nombres 10, 8, 5 et 1.
On veut obtenir un total de 24 en utilisant ces jetons.
Si on utilise le principe de l'algorithme glouton, quelle addition va-t-on réaliser pour obtenir ce total de 24 ?
Réponses :
A- 8+8+8
B- 10+8+5+1
C- 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
D- 10+10+1+1+1+1
Un système monétaire contient les pièces suivantes : 24, 15, 8, 5 et 2 unités. Le nombre de pièces de chaque sorte n'est pas limité.
On souhaite rendre 40 unités.
Quelle est la solution donnée par l'algorithme glouton de rendu de monnaie ?
Réponses :
A- [15, 15, 5, 5]
B- [24, 8, 8]
C- [15, 15, 8, 2]
D- L'algorithme échouera à rendre la somme de 40 unités.
Voici un arbre, on le parcourt en partant du haut (la racine) et en descendant de branche en branche (les noeuds) jusqu'à arriver à une feuille.
Par exemple on peut faire le parcours Racine 4 puis noeud 5 puis noeud 4 puis feuille 6.
Considérons un algorithme Glouton de parcours (racine vers feuille) de cet arbre, Sélectionnant le noeud le plus grand à chaque étape.
Quel chemin cet algorithme Glouton va-t-il parcourir ?
Réponses :
A- 4-->5-->4-->9
B- 4-->7-->2-->10
C- 4-->7-->3
D- 4-->5-->8
Parmi les affirmations suivantes, laquelle décrit correctement un algorithme glouton pour rendre la monnaie ?
Réponses :
A- L'algorithme essaie toutes les combinaisons possibles afin d'utiliser le nombre de pièces minimal quel que soit le système de monnaie.
B- L'algorithme rend la monnaie en utilisant la plus grande pièce possible et en n'utilisant chaque valeur de pièces qu'une seule fois.
C- L'algorithme rend la monnaie en utilisant la plus grande pièce possible et en utilisant le nombre de pièces minimal quel que soit le système de monnaie.
D- L'algorithme rend la monnaie en utilisant la plus grande pièce possible et en utilisant le nombre de pièces minimal pour le système de monnaie européen, mais pas forcément pour d'autres systèmes.
On considère le problème où l’on doit rendre 10 euros de monnaie.
On dispose de pièces de 1,5,8 euros.
Indiquer le rendu de monnaie donné par un algorithme glouton.
Réponses :
A- 5 ; 5
B- 8 ; 1 ; 1
C- 5 ; 1 ; 1 ; 1 ; 1 ; 1
D- L'algorithme glouton échouera à rendre la somme de 10 euros.
Il faut actualiser la page pour changer de question. Propriétaire de la ressource : le site GeNumsi en licence CC BY_NC-SA
la notion d'algorithme glouton,
qu'un algorithme glouton ne renvoie par forcément la solution optimale à un problème donné.
résoudre un problème grâce à un algorithme glouton,
implémenter un algorithme glouton donné,
améliorer un algorithme glouton donné.
Les différents
auteurs mettent l'ensemble du site à disposition selon les termes de la licence Creative
Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0
International